{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "25f1f0f7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3, 4, 7, 8, 102]\n"
     ]
    }
   ],
   "source": [
    "## 两个数组交集\n",
    "from typing import List\n",
    "class Solution:\n",
    "    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:\n",
    "        hash1 = [0]*1001\n",
    "        hash2 = [0]*1001        # 题目限定了数组长度\n",
    "        count = 0\n",
    "        result = []\n",
    "        if not nums1 or not nums2: return []\n",
    "        for i in nums1:\n",
    "            hash1[i] += 1\n",
    "\n",
    "        for j in nums2:\n",
    "            hash2[j] += 1\n",
    "\n",
    "        while count < 1001:\n",
    "            if hash1[count] and hash2[count]:\n",
    "                result.append(count) \n",
    "            count += 1\n",
    "        return result\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    nums1 = [3,4,5,7,8,102,145,234]\n",
    "    nums2 = [3,4,7,8,102,103,457,78,90,2,1,3]\n",
    "\n",
    "    sol = Solution().intersection(nums1,nums2)\n",
    "    print(sol)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f935565d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用集合\n",
    "class Solution:\n",
    "    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:\n",
    "        return list(set(nums1) & set(nums2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "67424b33",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Solution:\n",
    "    def intersection(self,nums1:List[int],nums2:List[int]) -> List[int]:\n",
    "        table = {}\n",
    "        for num in nums1:\n",
    "            table[num] = table.get(num,0) + 1\n",
    "\n",
    "        res = set()\n",
    "        for num in nums2:\n",
    "            if num in table: #num: 键\n",
    "                res.add(num)\n",
    "                del table[num]\n",
    "\n",
    "        return list(res)\n",
    "                \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97758963",
   "metadata": {},
   "source": [
    "### 代码功能概述\n",
    "这段代码定义了一个名为 `Solution` 的类，其中包含一个 `intersection` 方法，该方法的作用是找出两个整数列表 `nums1` 和 `nums2` 的交集，也就是找出同时存在于这两个列表中的元素，并且最终结果中每个元素只出现一次。\n",
    "\n",
    "### 代码逐行解释\n",
    "\n",
    "```python\n",
    "from typing import List\n",
    "\n",
    "class Solution:\n",
    "    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:\n",
    "        # 使用哈希表存储一个数组中的所有元素\n",
    "        table = {}\n",
    "        for num in nums1:\n",
    "            table[num] = table.get(num, 0) + 1\n",
    "```\n",
    "- `table = {}`：创建一个空字典 `table`，这里字典将作为哈希表使用，用于存储 `nums1` 中每个元素及其出现的次数。\n",
    "- `for num in nums1:`：遍历 `nums1` 列表中的每个元素。\n",
    "- `table[num] = table.get(num, 0) + 1`：使用字典的 `get` 方法来获取当前元素 `num` 在字典 `table` 中对应的计数值。如果 `num` 不在字典中，`get` 方法会返回默认值 `0`，然后将该值加 `1` 并存储到字典中，这样就记录了 `num` 在 `nums1` 中出现的次数。\n",
    "\n",
    "```python\n",
    "        # 使用集合存储结果\n",
    "        res = set()\n",
    "        for num in nums2:\n",
    "            if num in table:\n",
    "                res.add(num)\n",
    "                del table[num]\n",
    "```\n",
    "- `res = set()`：创建一个空集合 `res`，集合的特点是元素具有唯一性，适合用于存储交集结果，避免结果中出现重复元素。\n",
    "- `for num in nums2:`：遍历 `nums2` 列表中的每个元素。\n",
    "- `if num in table:`：检查当前元素 `num` 是否存在于字典 `table` 中，如果存在，说明 `num` 是两个列表的交集元素。\n",
    "- `res.add(num)`：将交集元素 `num` 添加到集合 `res` 中。\n",
    "- `del table[num]`：从字典 `table` 中删除该元素，这样可以避免后续重复处理该元素，保证结果中每个元素只出现一次。\n",
    "\n",
    "```python\n",
    "        return list(res)\n",
    "```\n",
    "- 将集合 `res` 转换为列表并返回，因为题目要求返回的结果是列表类型。\n",
    "\n",
    "### 字典相关方法介绍\n",
    "\n",
    "#### 1. `get(key, default=None)`\n",
    "- **功能**：返回指定键的值，如果键不在字典中，则返回默认值 `default`。\n",
    "- **示例**：\n",
    "```python\n",
    "my_dict = {'a': 1, 'b': 2}\n",
    "value = my_dict.get('a')  # 返回 1\n",
    "value2 = my_dict.get('c', 0)  # 返回 0，因为 'c' 不在字典中\n",
    "```\n",
    "\n",
    "#### 2. `in` 运算符\n",
    "- **功能**：用于检查字典中是否包含指定的键，如果包含则返回 `True`，否则返回 `False`。\n",
    "- **示例**：\n",
    "```python\n",
    "my_dict = {'a': 1, 'b': 2}\n",
    "if 'a' in my_dict:\n",
    "    print(\"键 'a' 存在于字典中\")\n",
    "```\n",
    "\n",
    "#### 3. `del` 语句\n",
    "- **功能**：用于删除字典中指定的键值对。\n",
    "- **示例**：\n",
    "```python\n",
    "my_dict = {'a': 1, 'b': 2}\n",
    "del my_dict['a']  # 删除键 'a' 及其对应的值\n",
    "print(my_dict)  # 输出: {'b': 2}\n",
    "```\n",
    "\n",
    "#### 4. `add()`（集合方法，这里集合用于存储结果）\n",
    "- **功能**：向集合中添加一个元素，如果元素已经存在于集合中，则不会重复添加。\n",
    "- **示例**：\n",
    "```python\n",
    "my_set = {1, 2}\n",
    "my_set.add(3)  # 集合变为 {1, 2, 3}\n",
    "my_set.add(2)  # 集合仍为 {1, 2, 3}\n",
    "```\n",
    "\n",
    "通过这些字典和集合的方法，代码高效地找出了两个列表的交集。 "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "env_py38",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
